#include "gpio.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

static char gpio_path[100];

static int gpio_config(const char *attr, const char *val)
{
    char file_path[100];
    int len;
    int fd;

    sprintf(file_path, "%s/%s", gpio_path, attr);
    if (0 > (fd = open(file_path, O_WRONLY))) {
        perror("open error");
        return fd;
    }

    len = strlen(val);
    if (len != write(fd, val, len)) {
        perror("write error");
        close(fd);
        return -1;
    }

    close(fd);  // 关闭文件
    return 0;
}

static int export_gpio(const char *gpio)
{
    int fd;
    int len;

    if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) {
        perror("open error");
        return -1;
    }

    len = strlen(gpio);
    if (len != write(fd, gpio, len)) {
        perror("write error");
        close(fd);
        return -1;
    }

    close(fd);  // 关闭文件
    return 0;
}

int init_gpio(const char *gpio, const char *value)
{
    sprintf(gpio_path, "/sys/class/gpio/gpio%s", gpio);
    if (access(gpio_path, F_OK)) { // 如果目录不存在 则需要导出
        if (export_gpio(gpio)) {
            return -1;
        }
    }

    if (gpio_config("direction", "out")) {
        return -1;
    }

    if (gpio_config("active_low", "0")) {
        return -1;
    }

    if (gpio_config("value", value)) {
        return -1;
    }

    return 0;
}

